package com.cjl.demo.data.structure;

/**
 * <p>Copyright: All Rights Reserved</p>
 * <p>Company:    http://www.ronglian.com</p>
 * <p>Description:  判断一个数是否是2的n次幂</p>
 * <p>Author:jlchen/陈金梁</p>
 * <p>Date:  2018/4/3</p>
 */
public class Math2power {

    /**
     * <p>Description: 通过除2和对2取余实现</p>
     * <p>@Author:jlchen/陈金梁</p>
     @ param t
     * @date 2018/4/3 8:27
     * @return
    */
    public boolean is2Power(int t){

        return false;
    }

    /**
     * <p>Description: 通过位运算判断</p>
     * <p>凡是2的n次方的整数，它的二进制的所有位中都只有一个1，
     * 并且这个1肯定在最高位。既然这样的话，那么这个问题就变成了如何来计算二进制位中1的个数</p>
     * <p>在向右移位的过程中，我们会把最后一位直接丢弃。因此，需要判断最后一位是否为1，而“与”操作可以达到目的。
     * 可以把这个八位的数字与00000001进行“与”操作。如果结果为1，则表示当前八位数的最后一位为1，否则为0。</p>
     * <p>@Author:jlchen/陈金梁</p>
     * @param t
     * @date 2018/4/3 8:29
     * @return boolean
     */
    public boolean is2PowerByByte(int t){
        if(t <0){
            return false;
        }
        int count = 0;
        while(t > 0)
        {
            count += t&0x01;
            t >>= 1;
        }
        if(count < 2 )
        {
            return true;    //若count = 0 或者   count =1，表明 i 是 2 的n次方
        }
        else
        {
            return false;
        }
    }

    /**
     * <p>Description: 通过位运算判断</p>
     * <p>以4(100)    7(0111)    8(1000)为例
     * 4 & 3 --> 100 & 011     = 0
     * 7 & 6 --> 0111 & 0110  != 0
     * 8 & 7 --> 1000 & 0111   = 0
     * 即 如果 m & (m - 1) == 0，则m是2的n次方。</p>
     * <p>@Author:jlchen/陈金梁</p>
     * @param t
     * @date 2018/4/3 8:29
     * @return boolean
     */
    public boolean is2PowerByByte2(int t){
        return (t>0 && (t & (t-1)) == 0);
    }

    public static void main(String[] args) {

    }
}
